﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using DotNetOpenAuth.AspNet;
using Microsoft.Web.WebPages.OAuth;
using SWGeneracionE.Models;

namespace SWGeneracionE.Controllers
{
    public class CatalogoController : BaseController
    {

        #region "Acciones Iglesia"
        [Authorize]
        public ActionResult Iglesias()
        {
            return View();
        }

        [HttpPost]
        public JsonResult IglesiaList(int jtStartIndex = 0, int jtPageSize = 0, string jtSorting = null)
        {
            try
            {
                var iglesiasCount = 0;
                if (string.IsNullOrEmpty(jtSorting))
                    jtSorting = "nombre ASC";
                var iglesias = UoW.iglesiaRepository.FindByPaging(i => i.Pais != null, ref iglesiasCount, jtStartIndex, jtPageSize, jtSorting)
                    .Select(i => new
                    {
                        idIglesia = i.idIglesia,
                        nombre = i.nombre,
                        pastor = i.pastor,
                        idPais = i.idPais
                    });

                return Json(new { Result = "OK", Records = iglesias, TotalRecordCount = iglesiasCount });
            }
            catch (Exception ex)
            {
                AgregarBitacora("Error IglesiaList: " + ex.Message + "--" + ex.Source);
                return Json(new { Result = "ERROR", Message = "Ocurrió un error al obtener listado de iglesias." });
            }
        }

        [HttpPost]
        public JsonResult CreateIglesia(Iglesia iglesia)
        {
            try
            {
                if (!ModelState.IsValid)
                {
                    AgregarBitacora("Error CreateIglesia: Formulario inválido");
                    return Json(new
                    {
                        Result = "ERROR",
                        Message = "¡El formulario no es válido! " +
                        "Corrija e intente nuevemente."
                    });
                }

                var addedIglesia = UoW.iglesiaRepository.Add(iglesia);
                UoW.Save();
                AgregarBitacora("Creación de iglesia (CreateIglesia): " + addedIglesia.idIglesia.ToString());
                return Json(new { Result = "OK", Record = addedIglesia });
            }
            catch (Exception ex)
            {
                AgregarBitacora("Error CreateIglesia: " + ex.Message + "--" + ex.Source);
                return Json(new { Result = "ERROR", Message = "Ocurrió un error al agregar iglesia." });
            }
        }

        [HttpPost]
        public JsonResult UpdateIglesia(Iglesia iglesia)
        {
            try
            {
                if (!ModelState.IsValid)
                {
                    AgregarBitacora("Error UpdateIglesia: Formulario inválido");
                    return Json(new
                    {
                        Result = "ERROR",
                        Message = "¡El formulario no es válido! " +
                        "Corrija e intente nuevemente."
                    });
                }

                UoW.iglesiaRepository.Edit(iglesia);
                UoW.Save();
                AgregarBitacora("Actualización de iglesia (UpdateIglesia): " + iglesia.idIglesia.ToString());
                return Json(new { Result = "OK" });
            }
            catch (Exception ex)
            {
                AgregarBitacora("Error UpdateIglesia: " + ex.Message + "--" + ex.Source);
                return Json(new { Result = "ERROR", Message = "Ocurrió un error al actualizar iglesia." });
            }
        }

        [HttpPost]
        public JsonResult DeleteIglesia(int idIglesia)
        {
            try
            {
                Iglesia iglesia = UoW.iglesiaRepository.FindFirst(p => p.idIglesia == idIglesia);
                UoW.iglesiaRepository.Delete(iglesia);
                UoW.Save();
                AgregarBitacora("Eliminación de iglesia (DeleteIglesia): " + idIglesia.ToString());
                return Json(new { Result = "OK" });
            }
            catch (Exception ex)
            {
                AgregarBitacora("Error DeleteIglesia: " + ex.Message + "--" + ex.Source);
                return Json(new { Result = "ERROR", Message = "Ocurrió un error al eliminar iglesia." });
            }
        }

        [HttpPost]
        public JsonResult GetIglesiaOptions(int idPais = 0)
        {
            try
            {
                if (idPais != 0)
                {
                    var iglesias = UoW.iglesiaRepository.FindBy(i => i.idPais == idPais || i.idPais == null).Select(
                                    i => new { DisplayText = i.nombre, Value = i.idIglesia }).OrderBy(p => p.DisplayText).ToList();
                    return Json(new { Result = "OK", Options = iglesias });
                }
                else
                {
                    var iglesias = UoW.iglesiaRepository.GetAll().Select(
                                    i => new { DisplayText = i.nombre, Value = i.idIglesia }).OrderBy(p => p.DisplayText).ToList();
                    return Json(new { Result = "OK", Options = iglesias });
                }
            }
            catch (Exception ex)
            {
                AgregarBitacora("Error GetIglesiaOptions: " + ex.Message + "--" + ex.Source);
                return Json(new { Result = "ERROR", Message = "Ocurrió un error al obtener listado de iglesias." });
            }
        }
        #endregion

        #region "Acciones Pais"
        [Authorize]
        public ActionResult Paises()
        {
            return View();
        }

        [HttpPost]
        public JsonResult PaisList(int jtStartIndex = 0, int jtPageSize = 0, string jtSorting = null)
        {
            try
            {
                var paisesCount = 0;
                if (string.IsNullOrEmpty(jtSorting))
                    jtSorting = "nombre ASC";
                var paises = UoW.paisRepository.GetAllPaging(ref paisesCount, jtStartIndex, jtPageSize, jtSorting)
                    .Select(p => new {
                        idPais = p.idPais,
                        nombre = p.nombre,
                        abreviacion = p.abreviacion,
                        codLlamada = p.codLlamada
                    });
                
                return Json(new { Result = "OK", Records = paises, TotalRecordCount = paisesCount });
            }
            catch (Exception ex)
            {
                AgregarBitacora("Error PaisList: " + ex.Message + "--" + ex.Source);
                return Json(new { Result = "ERROR", Message = "Ocurrió un error al obtener listado de paises." });
            }
        }

        [HttpPost]
        public JsonResult CreatePais(Pais pais)
        {
            try
            {
                if (!ModelState.IsValid)
                {
                    AgregarBitacora("Error CreatePais: Formulario inválido");
                    return Json(new
                    {
                        Result = "ERROR",
                        Message = "¡El formulario no es válido! " +
                        "Corrija e intente nuevemente."
                    });
                }

                var addedPais = UoW.paisRepository.Add(pais);
                UoW.Save();
                AgregarBitacora("Creación de pais (CreatePais): " + pais.idPais.ToString());
                return Json(new { Result = "OK", Record = addedPais });
            }
            catch (Exception ex)
            {
                AgregarBitacora("Error CreatePais: " + ex.Message + "--" + ex.Source);
                return Json(new { Result = "ERROR", Message = "Ocurrió un error al crear pais." });
            }
        }

        [HttpPost]
        public JsonResult UpdatePais(Pais pais)
        {
            try
            {
                if (!ModelState.IsValid)
                {
                    AgregarBitacora("Error UpdatePais: Formulario inválido");
                    return Json(new
                    {
                        Result = "ERROR",
                        Message = "¡El formulario no es válido! " +
                        "Corrija e intente nuevemente."
                    });
                }

                UoW.paisRepository.Edit(pais);
                UoW.Save();
                AgregarBitacora("Actualización de pais (UpdatePais): " + pais.idPais.ToString());
                return Json(new { Result = "OK" });
            }
            catch (Exception ex)
            {
                AgregarBitacora("Error UpdatePais: " + ex.Message + "--" + ex.Source);
                return Json(new { Result = "ERROR", Message = "Ocurrió un error al actualizar pais." });
            }
        }

        [HttpPost]
        public JsonResult DeletePais(int idPais)
        {
            try
            {
                Pais pais = UoW.paisRepository.FindFirst(p => p.idPais == idPais);
                UoW.paisRepository.Delete(pais);
                UoW.Save();
                AgregarBitacora("Eliminación de pais (DeletePais): " + pais.idPais.ToString());
                return Json(new { Result = "OK" });
            }
            catch (Exception ex)
            {
                AgregarBitacora("Error DeletePais: " + ex.Message + "--" + ex.Source);
                return Json(new { Result = "ERROR", Message = "Ocurrió un error al eliminar pais." });
            }
        }

        [HttpPost]
        public JsonResult GetPaisOptions()
        {
            try
            {
                var paises = UoW.paisRepository.GetAll().Select(
                                p => new { DisplayText = p.nombre, Value = p.idPais }).OrderBy(p => p.DisplayText).ToList();
                return Json(new { Result = "OK", Options = paises });
            }
            catch (Exception ex)
            {
                AgregarBitacora("Error GetPaisOptions: " + ex.Message + "--" + ex.Source);
                return Json(new { Result = "ERROR", Message = "Ocurrió un error al obtener opciones de pais." });
            }
        }
        #endregion

        #region "Acciones TipoDocumentoID"
        [Authorize]
        public ActionResult TiposDocumento()
        {
            return View();
        }

        [HttpPost]
        public JsonResult TipoDocumentoList(int jtStartIndex = 0, int jtPageSize = 0, string jtSorting = null)
        {
            try
            {
                var tipodocumentosCount = 0;
                if (string.IsNullOrEmpty(jtSorting))
                    jtSorting = "nombre ASC";
                var tiposdocumento = UoW.tipoDocumentoIdRepository.GetAllPaging(ref tipodocumentosCount, jtStartIndex, jtPageSize, jtSorting)
                    .Select(t => new
                    {
                        idTipoDocumentoID = t.idTipoDocumentoID,
                        nombre = t.nombre,
                        longitud = t.longitud,
                        tipo = t.tipo
                    });
                
                return Json(new { Result = "OK", Records = tiposdocumento, TotalRecordCount = tipodocumentosCount });
            }
            catch (Exception ex)
            {
                AgregarBitacora("Error TipoDocumentoList: " + ex.Message + "--" + ex.Source);
                return Json(new { Result = "ERROR", Message = "Ocurrió un error al obtener listado de tipos de documento." });
            }
        }

        [HttpPost]
        public JsonResult CreateTipoDocumento(TipoDocumentoID tipodocumento)
        {
            try
            {
                if (!ModelState.IsValid)
                {
                    AgregarBitacora("Error CreateTipoDocumento: Formulario inválido");
                    return Json(new
                    {
                        Result = "ERROR",
                        Message = "¡El formulario no es válido! " +
                        "Corrija e intente nuevemente."
                    });
                }

                var addedTipoDocumento = UoW.tipoDocumentoIdRepository.Add(tipodocumento);
                UoW.Save();
                AgregarBitacora("Creación de tipo de documento (CreateTipoDocumento): " + tipodocumento.idTipoDocumentoID.ToString());
                return Json(new { Result = "OK", Record = addedTipoDocumento });
            }
            catch (Exception ex)
            {
                AgregarBitacora("Error CreateTipoDocumento: " + ex.Message + "--" + ex.Source);
                return Json(new { Result = "ERROR", Message = "Ocurrió un error al crear tipo de documento." });
            }
        }

        [HttpPost]
        public JsonResult UpdateTipoDocumento(TipoDocumentoID tipodocumento)
        {
            try
            {
                if (!ModelState.IsValid)
                {
                    AgregarBitacora("Error UpdateTipoDocumento: Formulario inválido");
                    return Json(new
                    {
                        Result = "ERROR",
                        Message = "¡El formulario no es válido! " +
                        "Corrija e intente nuevemente."
                    });
                }

                UoW.tipoDocumentoIdRepository.Edit(tipodocumento);
                UoW.Save();
                AgregarBitacora("Actualización de tipo de documento (UpdateTipoDocumento): " + tipodocumento.idTipoDocumentoID.ToString());
                return Json(new { Result = "OK" });
            }
            catch (Exception ex)
            {
                AgregarBitacora("Error UpdateTipoDocumento: " + ex.Message + "--" + ex.Source);
                return Json(new { Result = "ERROR", Message = "Ocurrió un error al actualizar tipo de documento." });
            }
        }

        [HttpPost]
        public JsonResult DeleteTipoDocumento(int idTipoDocumentoID)
        {
            try
            {
                TipoDocumentoID tipodocumento = UoW.tipoDocumentoIdRepository
                    .FindFirst(t => t.idTipoDocumentoID == idTipoDocumentoID);
                UoW.tipoDocumentoIdRepository.Delete(tipodocumento);
                UoW.Save();
                AgregarBitacora("Eliminación de tipo de documento (DeleteTipoDocumento): " + idTipoDocumentoID.ToString());
                return Json(new { Result = "OK" });
            }
            catch (Exception ex)
            {
                AgregarBitacora("Error DeleteTipoDocumento: " + ex.Message + "--" + ex.Source);
                return Json(new { Result = "ERROR", Message = "Ocurrió un error al eliminar tipo de documento." });
            }
        }
        #endregion

        #region "Acciones Lugar"
        [Authorize]
        public ActionResult Lugares()
        {
            return View();
        }

        [HttpPost]
        public JsonResult LugarList(int jtStartIndex = 0, int jtPageSize = 0, string jtSorting = null)
        {
            try
            {
                var lugaresCount = 0;
                if (string.IsNullOrEmpty(jtSorting))
                    jtSorting = "nombre ASC";
                var lugares = UoW.lugarRepository.GetAllPaging(ref lugaresCount, jtStartIndex, jtPageSize, jtSorting)
                    .Select(l => new
                    {
                        idLugar = l.idLugar,
                        nombre = l.nombre,
                        idPais = l.idPais,
                        direccion = l.direccion
                    });

                return Json(new { Result = "OK", Records = lugares, TotalRecordCount = lugaresCount });
            }
            catch (Exception ex)
            {
                AgregarBitacora("Error LugarList: " + ex.Message + "--" + ex.Source);
                return Json(new { Result = "ERROR", Message = "Ocurrió un error al obtener listado de lugares." });
            }
        }

        [HttpPost]
        public JsonResult CreateLugar(Lugar lugar)
        {
            try
            {
                if (!ModelState.IsValid)
                {
                    AgregarBitacora("Error CreateLugar: Formulario inválido");
                    return Json(new
                    {
                        Result = "ERROR",
                        Message = "¡El formulario no es válido! " +
                        "Corrija e intente nuevemente."
                    });
                }

                var addedLugar = UoW.lugarRepository.Add(lugar);
                UoW.Save();
                AgregarBitacora("Creación de lugar (CreateLugar): " + lugar.idLugar.ToString());
                return Json(new { Result = "OK", Record = addedLugar });
            }
            catch (Exception ex)
            {
                AgregarBitacora("Error CreateLugar: " + ex.Message + "--" + ex.Source);
                return Json(new { Result = "ERROR", Message = "Ocurrió un error al crear lugar." });
            }
        }

        [HttpPost]
        public JsonResult UpdateLugar(Lugar lugar)
        {
            try
            {
                if (!ModelState.IsValid)
                {
                    AgregarBitacora("Error UpdateLugar: Formulario inválido");
                    return Json(new
                    {
                        Result = "ERROR",
                        Message = "¡El formulario no es válido! " +
                        "Corrija e intente nuevemente."
                    });
                }

                UoW.lugarRepository.Edit(lugar);
                UoW.Save();
                AgregarBitacora("Actualización de lugar (UpdateLugar): " + lugar.idLugar.ToString());
                return Json(new { Result = "OK" });
            }
            catch (Exception ex)
            {
                AgregarBitacora("Error UpdateLugar: " + ex.Message + "--" + ex.Source);
                return Json(new { Result = "ERROR", Message = "Ocurrió un error al actualizar lugar" });
            }
        }

        [HttpPost]
        public JsonResult DeleteLugar(int idLugar)
        {
            try
            {
                Lugar lugar = UoW.lugarRepository.FindFirst(l => l.idLugar == idLugar);
                UoW.lugarRepository.Delete(lugar);
                UoW.Save();
                AgregarBitacora("Eliminación de lugar (DeleteLugar): " + idLugar.ToString());
                return Json(new { Result = "OK" });
            }
            catch (Exception ex)
            {
                AgregarBitacora("Error DeleteLugar: " + ex.Message + "--" + ex.Source);
                return Json(new { Result = "ERROR", Message = "Ocurrió un error al eliminar lugar." });
            }
        }

        [HttpPost]
        public JsonResult GetLugarOptions()
        {
            try
            {
                var lugares = UoW.lugarRepository.GetAll().Select(
                                    l => new { DisplayText = l.nombre, Value = l.idLugar }).OrderBy(p => p.DisplayText).ToList();
                return Json(new { Result = "OK", Options = lugares });

            }
            catch (Exception ex)
            {
                AgregarBitacora("Error GetLugarOptions: " + ex.Message + "--" + ex.Source);
                return Json(new { Result = "ERROR", Message = "Ocurrió un error al obtener listado de lugares." });
            }
        }
        #endregion

    }
}
